package com.iwhalecloud.bss.kite.cucc.service.scene.query;

import com.iwhalecloud.bss.kite.client.api.scene.query.IQuerySceneAccessProdInstAcctService;
import com.iwhalecloud.bss.kite.client.api.scene.query.IQuerySceneCommonService;
import com.iwhalecloud.bss.kite.client.dto.DataResult;
import com.iwhalecloud.bss.kite.client.dto.inst.InstAttrDTO;
import com.iwhalecloud.bss.kite.client.dto.inst.ProdInstAcctDTO;
import com.iwhalecloud.bss.kite.common.constant.ErrorConsts;
import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.util.KiteListUtils;
import com.iwhalecloud.bss.kite.common.util.KiteObjectUtils;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.common.validate.annotation.KiteNotBlank;
import com.iwhalecloud.bss.kite.manager.api.IQuerySceneInstService;
import com.iwhalecloud.bss.kite.manager.enums.ActionType;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInstAcct;
import com.iwhalecloud.bss.kite.service.scene.AbstractInstService;
import com.iwhalecloud.bss.kite.service.util.CopyToDtoUtil;
import com.ztesoft.bss.common.util.SpringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author G
 * @since 2019/6/13
 */
@Service("querySceneAccessProdInstAcctService")
public class QuerySceneAccessProdInstAcctService extends AbstractInstService
    implements IQuerySceneAccessProdInstAcctService {

    @Autowired
    private IQuerySceneInstService querySceneInstService;


    /***
     * 获取接入产品的账户定制关系；
     *
     * @param sceneInstId
     * @param accessProdInstId
     * @param custId 客户id，分片字段，必填
     * @return 账户定制关系集合
     */
    @Override
    @Validated
    public DataResult<List<ProdInstAcctDTO>> listAccessProdInstAcctRels(@KiteNotBlank String sceneInstId,
                                                                        @KiteNotBlank String accessProdInstId, @KiteNotBlank String custId) {
        try {
            List<KiteProdInstAcct> kiteProdInstAcctList = querySceneInstService
                .listProdInstAccts(custId, accessProdInstId);
            List<ProdInstAcctDTO> dtoList = new ArrayList<>();
            if (!CollectionUtils.isEmpty(kiteProdInstAcctList)) {
                dtoList = CopyToDtoUtil.transProdInstAcctDtoList(kiteProdInstAcctList);
            }
            else {
                //从公共信息中加载产品账户实例
                List<ProdInstAcctDTO> commonDtoList = isNewWithAddProdInstAcct(sceneInstId, custId, dtoList,
                    accessProdInstId);
                if (!KiteListUtils.isEmpty(commonDtoList)) {
                    dtoList = commonDtoList;
                }
            }
            return ErrorConsts.SUCCESS.getResult(dtoList);
        }
        catch (Exception e) {
            return ErrorConsts.SUCCESS.getResult(Collections.emptyList());
        }
    }

    /***
     * 获取接入产品的账户定制关系（是否默认账户区分）
     *
     * @param sceneInstId 场景实例ID
     * @param accessProdInstId 接入产品实例ID
     * @param isDefault 是否默认；
     * @param custId 客户id，分片字段，必填
     * @return 账户定制关系集合
     */
    @Override
    @Validated
    public DataResult<List<ProdInstAcctDTO>> listAccessProdInstAcctRels(@KiteNotBlank String sceneInstId,
                                                                        @KiteNotBlank String accessProdInstId, @KiteNotBlank String isDefault, @KiteNotBlank String custId) {
        List<KiteProdInstAcct> kiteProdInstAcctList = querySceneInstService.listProdInstAccts(sceneInstId);
        List<ProdInstAcctDTO> dtoList = new ArrayList<>();
        if (!CollectionUtils.isEmpty(kiteProdInstAcctList)) {
            dtoList = CopyToDtoUtil.transProdInstAcctDtoList(kiteProdInstAcctList);
            // TODO 待确认 装箱
        }
        //从公共信息中加载产品账户实例
        List<ProdInstAcctDTO> commonDtoList = isNewWithAddProdInstAcct(sceneInstId, custId, dtoList, accessProdInstId);
        if (!KiteListUtils.isEmpty(commonDtoList)) {
            dtoList = commonDtoList;
        }
        // else {
        // dtoList = queryProdInstAcctRelBO.listAccessProdInstAcctRels(accessProdInstId, custId, isDefault);
        // checkProdInstAcctRelList(dtoList);
        // }
        return ErrorConsts.SUCCESS.getResult(dtoList);
    }

    public List<ProdInstAcctDTO> isNewWithAddProdInstAcct(String sceneInstId, String custId, List<ProdInstAcctDTO> dtoList, String prodInst) {
        List<ProdInstAcctDTO> newDtoList = new ArrayList<ProdInstAcctDTO>();
        if (KiteObjectUtils.isEmpty(dtoList)) {
            IQuerySceneCommonService querySceneCommonService = SpringUtil.getBean(IQuerySceneCommonService.class);
            List<InstAttrDTO> commonAttrList = querySceneCommonService.listCommonAttrs(sceneInstId, custId).getResultObject();
            List<InstAttrDTO> result = commonAttrList.stream()
                .filter(kiteAttrConfig -> KiteStringUtils.equals(KeyConsts.ACCT_ID, kiteAttrConfig.getFieldName()))
                .collect(Collectors.toList());
            if (!KiteObjectUtils.isEmpty(result) && !KiteObjectUtils.isEmpty(result.get(0)) && !KiteObjectUtils.isEmpty(result.get(0).getValue())) {
                InstAttrDTO instAttrDTO = result.get(0);
                ProdInstAcctDTO prodInstAcctDTO = new ProdInstAcctDTO();
                prodInstAcctDTO.setOwnerCustId(custId);
                prodInstAcctDTO.setProdInstId(prodInst);
                prodInstAcctDTO.setAcctId(instAttrDTO.getValue());
                prodInstAcctDTO.setActionType(ActionType.A.name());
                prodInstAcctDTO.setAcctItemGroupId(KeyConsts.ACCT_ITEM_TYPE_GROUP_ID);
                newDtoList.add(prodInstAcctDTO);
            }
        }
        return newDtoList;
    }
}
